HAL DCMI initialization and configuration functions migration ¶
The goal of this page is to show how to migrate the initialization sequence using STM32CubeMX2:
Open STM32CubeMX2 DCMI configuration panel.
Configure the SW layer HAL
Configure the main DCMI features.
Configure the additional feature configuration of the DCMI if needed.
Configure the GPIOs needed by the DCMI.
Configure the DCMI DMA(s) if the application requires to use the DCMI in DMA mode.
Configure the NVIC if the application requires the DCMI to be used in IT mode.
Generate the code.
HAL DCMI configuration panel ¶
Create a new project with the STM32CubeMX2, then start the initialization and the main configuration.
HAL DCMI main features configuration ¶
Configure the DCMI main features.
HAL DCMI additional features configuration ¶
Configure the DCMI additional feature if needed.
GPIO configuration ¶
Configure gpio pins.
DMA configuration ¶
Configure the DMA for data reception as needed.
NVIC configuration ¶
Configure the NVIC in case of an interrupt.
Generated DCMI initialization and de-initialization sequences ¶
The DCMI initialization sequence is generated in the
mx_dcmi_hal_init
function in the
mx_dcmi.c
file under
$YOUR_PROJECT_NAME$/$YOUR_PROJECT_NAME$_SW/generated/STM32Cube_CodeGen.
Related concepts:
|
Topic |
HAL1 code snippet |
HAL2 code snippet |
|---|---|---|
|
Initialization and configuration sequence |
static void MX_DCMI_Init(void)
{
hdcmi.Instance = DCMI;
hdcmi.Init.JPEGMode = DCMI_JPEG_DISABLE;
hdcmi.Init.PCKPolarity = DCMI_PCKPOLARITY_FALLING;
hdcmi.Init.HSPolarity = DCMI_HSPOLARITY_LOW;
hdcmi.Init.VSPolarity = DCMI_VSPOLARITY_LOW;
hdcmi.Init.ExtendedDataMode = DCMI_EXTEND_DATA_8B;
hdcmi.Init.CaptureRate = DCMI_CR_ALL_FRAME;
hdcmi.Init.SynchroMode = DCMI_SYNCHRO_EMBEDDED;
hdcmi.Init.SyncroCode.FrameStartCode = 0;
hdcmi.Init.SyncroCode.FrameEndCode = 0;
hdcmi.Init.SyncroCode.LineEndCode = 0;
hdcmi.Init.SyncroCode.LineStartCode = 0;
hdcmi.Init.ByteSelectMode = DCMI_BSM_ALL;
hdcmi.Init.ByteSelectStart = DCMI_OEBS_ODD;
hdcmi.Init.LineSelectMode = DCMI_LSM_ALL;
hdcmi.Init.LineSelectStart = DCMI_OELS_ODD;
if (HAL_DCMI_Init(&hdcmi) != HAL_OK) { Error_Handler(); }
}
void HAL_DCMI_MspInit(DCMI_HandleTypeDef* hdcmi)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(hdcmi->Instance==DCMI)
{
/* Peripheral clock enable */
__HAL_RCC_DCMI_PSSI_CLK_ENABLE();
__HAL_RCC_GPIOI_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOH_CLK_ENABLE();
__HAL_RCC_GPIOE_CLK_ENABLE();
/**DCMI GPIO Configuration
PI6 ------> DCMI_D6
PC11 ------> DCMI_D4
PI5 ------> DCMI_VSYNC
PB6 ------> DCMI_D5
PH12 ------> DCMI_D3
PI7 ------> DCMI_D7
PH10 ------> DCMI_D1
PE0 ------> DCMI_D2
PH8 ------> DCMI_HSYNC
PH9 ------> DCMI_D0
PH5 ------> DCMI_PIXCLK
*/
GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_5|GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF10_DCMI;
HAL_GPIO_Init(GPIOI, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_11;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF10_DCMI;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_6;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF10_DCMI;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_10|GPIO_PIN_8|GPIO_PIN_9
|GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF10_DCMI;
HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF10_DCMI;
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
/* DCMI DMA Init */
/* GPDMA1_REQUEST_DCMI Init */
handle_GPDMA1_Channel12.Instance = GPDMA1_Channel12;
handle_GPDMA1_Channel12.Init.Request = GPDMA1_REQUEST_DCMI;
handle_GPDMA1_Channel12.Init.BlkHWRequest = DMA_BREQ_SINGLE_BURST;
handle_GPDMA1_Channel12.Init.Direction = DMA_PERIPH_TO_MEMORY;
handle_GPDMA1_Channel12.Init.SrcInc = DMA_SINC_FIXED;
handle_GPDMA1_Channel12.Init.DestInc = DMA_DINC_FIXED;
handle_GPDMA1_Channel12.Init.SrcDataWidth = DMA_SRC_DATAWIDTH_BYTE;
handle_GPDMA1_Channel12.Init.DestDataWidth = DMA_DEST_DATAWIDTH_BYTE;
handle_GPDMA1_Channel12.Init.Priority = DMA_LOW_PRIORITY_LOW_WEIGHT;
handle_GPDMA1_Channel12.Init.SrcBurstLength = 1;
handle_GPDMA1_Channel12.Init.DestBurstLength = 1;
handle_GPDMA1_Channel12.Init.TransferAllocatedPort = DMA_SRC_ALLOCATED_PORT0|DMA_DEST_ALLOCATED_PORT0;
handle_GPDMA1_Channel12.Init.TransferEventMode = DMA_TCEM_BLOCK_TRANSFER;
handle_GPDMA1_Channel12.Init.Mode = DMA_NORMAL;
if (HAL_DMA_Init(&handle_GPDMA1_Channel12) != HAL_OK)
{
Error_Handler();
}
__HAL_LINKDMA(hdcmi, DMA_Handle, handle_GPDMA1_Channel12);
if (HAL_DMA_ConfigChannelAttributes(&handle_GPDMA1_Channel12, DMA_CHANNEL_NPRIV) != HAL_OK)
{
Error_Handler();
}
/* DCMI interrupt Init */
HAL_NVIC_SetPriority(DCMI_PSSI_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(DCMI_PSSI_IRQn);
}
}
|
hal_dcmi_handle_t *mx_dcmi_hal_init(void)
{
hal_dcmi_parallel_config_t p_parallel_config;
hal_dcmi_pipe_config_t p_pipe_config;
if (HAL_DCMI_Init(&hDCMI, HAL_DCMI) != HAL_OK)
{
return NULL;
}
HAL_RCC_DCMI_PSSI_EnableClock();
p_parallel_config.format = HAL_DCMI_FORMAT_UNCOMPRESSED;
p_parallel_config.pixel_polarity = HAL_DCMI_PIXEL_CLOCK_FALLING;
p_parallel_config.hsync_polarity = HAL_DCMI_HSYNC_LOW;
p_parallel_config.vsync_polarity = HAL_DCMI_VSYNC_LOW;
p_parallel_config.data_width = HAL_DCMI_EXTENDED_DATA_8_BITS;
if (HAL_DCMI_PARALLEL_SetConfig(&hDCMI, &p_parallel_config) != HAL_OK)
{
return NULL;
}
p_pipe_config.frame_rate = HAL_DCMI_FRAME_CAPTURE_ALL;
if (HAL_DCMI_SetConfigPipe(&hDCMI, HAL_DCMI_PIPE_0, &p_pipe_config) != HAL_OK)
{
return NULL;
}
/* The configuration of the synchronization mode, synchronization code, byte select mode,
byte select start, line select mode and line select start are set to their default values
thus in HAL2 we do not need for additional function calls to configure these settings */
/* DCMI GPIO Configuration **************************************************/
HAL_RCC_GPIOA_EnableClock();
HAL_RCC_GPIOC_EnableClock();
HAL_RCC_GPIOE_EnableClock();
HAL_RCC_GPIOB_EnableClock();
hal_gpio_config_t gpio_config;
/**
DCMI GPIO Configuration
[GPIO Pin] ------> [Signal Name]
PA6 ------> DCMI_PIXCLK
**/
gpio_config.mode = HAL_GPIO_MODE_ALTERNATE;
gpio_config.output_type = HAL_GPIO_OUTPUT_PUSHPULL;
gpio_config.pull = HAL_GPIO_PULL_UP;
gpio_config.speed = HAL_GPIO_SPEED_FREQ_VERY_HIGH;
gpio_config.alternate = HAL_GPIO_AF_4;
HAL_GPIO_Init(HAL_GPIOA, HAL_GPIO_PIN_6, &gpio_config);
/**
DCMI GPIO Configuration
[GPIO Pin] ------> [Signal Name]
PA9 ------> DCMI_D0
PA10 ------> DCMI_D1
**/
gpio_config.mode = HAL_GPIO_MODE_ALTERNATE;
gpio_config.output_type = HAL_GPIO_OUTPUT_PUSHPULL;
gpio_config.pull = HAL_GPIO_PULL_UP;
gpio_config.speed = HAL_GPIO_SPEED_FREQ_VERY_HIGH;
gpio_config.alternate = HAL_GPIO_AF_5;
HAL_GPIO_Init(HAL_GPIOA, HAL_GPIO_PIN_9 | HAL_GPIO_PIN_10, &gpio_config);
/**
DCMI GPIO Configuration
[GPIO Pin] ------> [Signal Name]
PC11 ------> DCMI_D2
PC9 ------> DCMI_D3
**/
gpio_config.mode = HAL_GPIO_MODE_ALTERNATE;
gpio_config.output_type = HAL_GPIO_OUTPUT_PUSHPULL;
gpio_config.pull = HAL_GPIO_PULL_UP;
gpio_config.speed = HAL_GPIO_SPEED_FREQ_VERY_HIGH;
gpio_config.alternate = HAL_GPIO_AF_4;
HAL_GPIO_Init(HAL_GPIOC, HAL_GPIO_PIN_11 | HAL_GPIO_PIN_9, &gpio_config);
/**
DCMI GPIO Configuration
[GPIO Pin] ------> [Signal Name]
PE4 ------> DCMI_D4
**/
gpio_config.mode = HAL_GPIO_MODE_ALTERNATE;
gpio_config.output_type = HAL_GPIO_OUTPUT_PUSHPULL;
gpio_config.pull = HAL_GPIO_PULL_UP;
gpio_config.speed = HAL_GPIO_SPEED_FREQ_VERY_HIGH;
gpio_config.alternate = HAL_GPIO_AF_10;
HAL_GPIO_Init(HAL_GPIOE, HAL_GPIO_PIN_4, &gpio_config);
/**
DCMI GPIO Configuration
[GPIO Pin] ------> [Signal Name]
PB6 ------> DCMI_D5
PB8 ------> DCMI_D6
PB9 ------> DCMI_D7
PB7 ------> DCMI_VSYNC
**/
gpio_config.mode = HAL_GPIO_MODE_ALTERNATE;
gpio_config.output_type = HAL_GPIO_OUTPUT_PUSHPULL;
gpio_config.pull = HAL_GPIO_PULL_UP;
gpio_config.speed = HAL_GPIO_SPEED_FREQ_VERY_HIGH;
gpio_config.alternate = HAL_GPIO_AF_10;
HAL_GPIO_Init(HAL_GPIOB,
HAL_GPIO_PIN_6 | HAL_GPIO_PIN_8 | HAL_GPIO_PIN_9 | HAL_GPIO_PIN_7, &gpio_config);
/**
DCMI GPIO Configuration
[GPIO Pin] ------> [Signal Name]
PA4 ------> DCMI_HSYNC
**/
gpio_config.mode = HAL_GPIO_MODE_ALTERNATE;
gpio_config.output_type = HAL_GPIO_OUTPUT_PUSHPULL;
gpio_config.pull = HAL_GPIO_PULL_UP;
gpio_config.speed = HAL_GPIO_SPEED_FREQ_VERY_HIGH;
gpio_config.alternate = HAL_GPIO_AF_10;
HAL_GPIO_Init(HAL_GPIOA, HAL_GPIO_PIN_4, &gpio_config);
/* DMA Configuration ********************************************************/
HAL_RCC_GPDMA1_EnableClock();
if (HAL_DMA_Init(&hGPDMA1_CH0, HAL_GPDMA1_CH0) != HAL_OK)
{
return NULL;
}
hal_dma_direct_xfer_config_t xfer_cfg_dcmi_dma_pssi_dma;
xfer_cfg_dcmi_dma_pssi_dma.request = HAL_GPDMA1_REQUEST_DCMI_PSSI;
xfer_cfg_dcmi_dma_pssi_dma.direction = HAL_DMA_DIRECTION_PERIPH_TO_MEMORY;
xfer_cfg_dcmi_dma_pssi_dma.src_inc = HAL_DMA_SRC_ADDR_FIXED;
xfer_cfg_dcmi_dma_pssi_dma.dest_inc = HAL_DMA_DEST_ADDR_INCREMENTED;
xfer_cfg_dcmi_dma_pssi_dma.src_data_width = HAL_DMA_SRC_DATA_WIDTH_WORD;
xfer_cfg_dcmi_dma_pssi_dma.dest_data_width = HAL_DMA_DEST_DATA_WIDTH_WORD;
xfer_cfg_dcmi_dma_pssi_dma.priority = HAL_DMA_PRIORITY_LOW_WEIGHT_LOW;
if (HAL_DMA_SetConfigPeriphDirectXfer(&hGPDMA1_CH0, &xfer_cfg_dcmi_dma_pssi_dma) != HAL_OK)
{
return NULL;
}
/* Enable the interruption for GPDMA1_CH0 */
HAL_CORTEX_NVIC_SetPriority(GPDMA1_CH0_IRQn,
HAL_CORTEX_NVIC_PREEMP_PRIORITY_0,
HAL_CORTEX_NVIC_SUB_PRIORITY_0);
HAL_CORTEX_NVIC_EnableIRQ(GPDMA1_CH0_IRQn);
/* Link the DMA handle to the DCMI handle */
if (HAL_DCMI_SetDMA(&hDCMI, &hGPDMA1_CH0) != HAL_OK)
{
return NULL;
}
/* DCMI NVIC Configuration **************************************************/
HAL_CORTEX_NVIC_SetPriority(DCMI_PSSI_IRQn,
HAL_CORTEX_NVIC_PREEMP_PRIORITY_0,
HAL_CORTEX_NVIC_SUB_PRIORITY_0);
HAL_CORTEX_NVIC_EnableIRQ(DCMI_PSSI_IRQn);
return &hDCMI;
}
|
|
Deinitialization sequence |
void HAL_DCMI_MspDeInit(DCMI_HandleTypeDef* hdcmi)
{
if(hdcmi->Instance==DCMI)
{
/* Peripheral clock disable */
__HAL_RCC_DCMI_PSSI_CLK_DISABLE();
/**DCMI GPIO Configuration
PI6 ------> DCMI_D6
PC11 ------> DCMI_D4
PI5 ------> DCMI_VSYNC
PB6 ------> DCMI_D5
PH12 ------> DCMI_D3
PI7 ------> DCMI_D7
PH10 ------> DCMI_D1
PE0 ------> DCMI_D2
PH8 ------> DCMI_HSYNC
PH9 ------> DCMI_D0
PH5 ------> DCMI_PIXCLK
*/
HAL_GPIO_DeInit(GPIOI,
GPIO_PIN_6|GPIO_PIN_5|GPIO_PIN_7);
HAL_GPIO_DeInit(GPIOC, GPIO_PIN_11);
HAL_GPIO_DeInit(GPIOB, GPIO_PIN_6);
HAL_GPIO_DeInit(GPIOH,
GPIO_PIN_12 | GPIO_PIN_10 | GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_5);
HAL_GPIO_DeInit(GPIOE, GPIO_PIN_0);
/* DCMI DMA DeInit */
HAL_DMA_DeInit(hdcmi->DMA_Handle);
/* DCMI interrupt DeInit */
HAL_NVIC_DisableIRQ(DCMI_PSSI_IRQn);
}
}
|
void mx_dcmi_deinit(void)
{
/* De-initialize the DCMI */
HAL_DCMI_DeInit(&hDCMI);
/* De-initialize the DMA channel */
HAL_DMA_DeInit(&hGPDMA1_CH0);
/* Disable the interruption for DMA */
HAL_CORTEX_NVIC_DisableIRQ(GPDMA1_CH0_IRQn);
/* Disable the interruption for DCMI */
HAL_CORTEX_NVIC_DisableIRQ(DCMI_PSSI_IRQn);
/* De-initialize all GPIO pins associated with DCMI */
HAL_GPIO_DeInit(HAL_GPIOA,
HAL_GPIO_PIN_4| HAL_GPIO_PIN_6 | HAL_GPIO_PIN_9 | HAL_GPIO_PIN_10);
HAL_GPIO_DeInit(HAL_GPIOC, HAL_GPIO_PIN_9 | HAL_GPIO_PIN_11);
HAL_GPIO_DeInit(HAL_GPIOE, HAL_GPIO_PIN_4);
HAL_GPIO_DeInit(HAL_GPIOB,
HAL_GPIO_PIN_6 | HAL_GPIO_PIN_7 | HAL_GPIO_PIN_8 | HAL_GPIO_PIN_9);
HAL_RCC_DCMI_PSSI_DisableClock();
}
|